package co.edu.usbcali.rebio.presentation.backEndBeans;

import co.edu.usbcali.rebio.exceptions.*;
import co.edu.usbcali.rebio.modelo.*;
import co.edu.usbcali.rebio.modelo.dto.RebIngenioDTO;
import co.edu.usbcali.rebio.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.rebio.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;


import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;


/**
 *
 *
 * @author Zathura Code Generator http://code.google.com/p/zathura
 *
 */
public class RebIngenioView extends DataSource implements Renderable,
DisposableBean {
	private HtmlInputText txtIngEstado;
	private HtmlInputText txtIngNombre;
	private HtmlInputText txtIngCodigo;
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private HtmlSelectOneMenu cmbIngEstado;
	private boolean renderDataTable;
	private boolean flag = true;
	private HtmlCommandButton btnAceptar;
	private boolean btnErrorf = false;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<RebIngenio> rebIngenio;
	private List<RebIngenioDTO> rebIngenioDTO;
	private List<SelectItem> estado = new ArrayList<SelectItem>();
	private BusinessDelegatorView businessDelegatorView;

	public RebIngenioView() {
		super("");
	}

	public String action_clear() {
		cmbIngEstado.setValue(null);
		cmbIngEstado.setDisabled(false);
		txtIngNombre.setValue(null);
		txtIngNombre.setDisabled(false);
		txtIngCodigo.setValue(null);
		txtIngCodigo.setDisabled(false);
		btnSave.setDisabled(false);
		btnDelete.setDisabled(true);
		btnModify.setDisabled(true);
		btnClear.setDisabled(false);

		return "";
	}

	public void listener_txtId(ValueChangeEvent event) {
		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
			RebIngenio entity = null;

			try {
				Integer ingCodigo = new Integer(txtIngCodigo.getValue()
						.toString());
				entity = BusinessDelegatorView.getRebIngenio(ingCodigo);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				cmbIngEstado.setDisabled(false);
				txtIngNombre.setDisabled(false);
				txtIngCodigo.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				cmbIngEstado.setValue(entity.getIngEstado());
				cmbIngEstado.setDisabled(false);
				txtIngNombre.setValue(entity.getIngNombre());
				txtIngNombre.setDisabled(false);
				txtIngCodigo.setValue(entity.getIngCodigo());
				txtIngCodigo.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}

	public String action_cargar(String ingCodigo) {
		RebIngenio entity = null;
		if (ingCodigo != null){            

			try {
				int codigo = Integer.parseInt(ingCodigo);
				entity = businessDelegatorView.getRebIngenio(codigo);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				cmbIngEstado.setDisabled(false);
				txtIngNombre.setDisabled(false);
				txtIngCodigo.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				cmbIngEstado.setValue(entity.getIngEstado());
				cmbIngEstado.setDisabled(false);
				txtIngNombre.setValue(entity.getIngNombre());
				txtIngNombre.setDisabled(false);
				txtIngCodigo.setValue(entity.getIngCodigo());
				txtIngCodigo.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
		return ("");
	}
	
	public String action_cerrar2(){
		btnErrorf = false;
		return "";
	}

	public String action_save() {
		try {
			String estado = cmbIngEstado.getValue().toString();
			String ingNombre = txtIngNombre.getValue().toString().toUpperCase();
			
			if(!Utilities.soloLetras(ingNombre)){
				throw new Exception("El Nombre del Ingenio debe contener solo letras");
			}
			
			if(ingNombre.trim().equals("")){
				throw new Exception("El Nombre del Ingenio es de car&#225;cter obligatorio");
			}
			
			if (estado.trim().equals("") || estado.equals("Seleccione un valor")) {
				throw new Exception(
				"El Estado del Ingenio es de car&#225;cter obligatorio, debes seleccionar alguno");
			}
			
			BusinessDelegatorView.saveRebIngenio(null, estado, ingNombre);
			btnErrorf = true;
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("rebIngenioView").requestRender();
			
			action_clear();
		} catch (Exception e) {
			btnErrorf = true;
			btnAceptar.requestFocus();
			FacesUtils.addErrorMessage(e.getMessage());
//			FacesUtils.addInfoMessage(e.getMessage());
		}
		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deleteRebIngenio(FacesUtils.checkInteger(
					txtIngCodigo));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
	
	public String action_inactivar() {
		try {
			String est = "INACTIVO";
			Integer id = Integer.parseInt(txtIngCodigo.getValue().toString());
			String estado = cmbIngEstado.getValue().toString();
			String ingNombre = txtIngNombre.getValue().toString().toUpperCase();
			
			if(!Utilities.soloLetras(ingNombre)){
				throw new Exception("El Nombre del Ingenio debe contener solo letras");
			}
			
			if(ingNombre.trim().equals("")){
				throw new Exception("El Nombre del Ingenio es de car&#225;cter obligatorio");
			}
			
			
			
			BusinessDelegatorView.updateRebIngenio(id, est,
					ingNombre);
			btnErrorf = true;
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("rebIngenioView").requestRender();
			
			action_clear();
		} catch (Exception e) {
			btnErrorf = true;
			btnAceptar.requestFocus();
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			Integer id = Integer.parseInt(txtIngCodigo.getValue().toString());
			String estado = cmbIngEstado.getValue().toString();
			String ingNombre = txtIngNombre.getValue().toString().toUpperCase();
			
			if(!Utilities.soloLetras(ingNombre)){
				throw new Exception("El Nombre del Ingenio debe contener solo letras");
			}
			
			if(ingNombre.trim().equals("")){
				throw new Exception("El Nombre del Ingenio es de car&#225;cter obligatorio");
			}
			
			if (estado.trim().equals("") || estado.equals("Seleccione un valor")) {
				throw new Exception(
				"El Estado del Ingenio es de car&#225;cter obligatorio, debes seleccionar alguno");
			}
			
			BusinessDelegatorView.updateRebIngenio(id, estado, ingNombre);
			btnErrorf = true;
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("rebIngenioView").requestRender();
			
			action_clear();
		} catch (Exception e) {
			btnErrorf = true;
			btnAceptar.requestFocus();
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(Integer ingCodigo, String ingEstado,
			String ingNombre) throws Exception {
		try {
			BusinessDelegatorView.updateRebIngenio(ingCodigo, ingEstado,
					ingNombre);
			renderManager.getOnDemandRenderer("RebIngenioView").requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			//renderManager.getOnDemandRenderer("RebIngenioView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<RebIngenio> getRebIngenio() {
		if (flag) {
			try {
				rebIngenio = BusinessDelegatorView.getRebIngenio();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return rebIngenio;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setRebIngenio(List<RebIngenio> rebIngenio) {
		this.rebIngenio = rebIngenio;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberRebIngenio() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	 private DataPage<RebIngenio> getDataPage(int startRow, int pageSize) {
		 // Retrieve the total number of objects from the database.  This
		 // number is required by the DataPage object so the paginator will know
		 // the relative location of the page data.
		 int totalNumberRebIngenio = 0;

		 try {
			 totalNumberRebIngenio = BusinessDelegatorView.findTotalNumberRebIngenio()
			 .intValue();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Calculate indices to be displayed in the ui.
		 int endIndex = startRow + pageSize;

		 if (endIndex > totalNumberRebIngenio) {
			 endIndex = totalNumberRebIngenio;
		 }

		 try {
			 rebIngenio = BusinessDelegatorView.findPageRebIngenio(sortColumnName,
					 sortAscending, startRow, endIndex - startRow);

			 // Remove this Renderable from the existing render groups.
			 //leaveRenderGroups();        			
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Add this Renderable to the new render groups.
		 //joinRenderGroups();
		 // Reset the dirtyData flag.
		 onePageDataModel.setDirtyData(false);
		 // This is required when using Hibernate.  If the SessionManager is not
		 // cleared or closed objects are cached and stale objects will show up
		 // in the table.
		 // This way, the detached objects are reread from the database.
		 // This call is not required with Hibernate, which uses a Query Hint
		 // to clear the l2 cache in the DAO.
		 flag = true;

		 return new DataPage<RebIngenio>(totalNumberRebIngenio, startRow,
				 rebIngenio);
	 }

	 public DataModel getDataDTO() {
		 state = PersistentFacesState.getInstance();

		 if (onePageDataModel == null) {
			 onePageDataModel = new LocalDataModelDTO(pageSize);
		 }

		 return onePageDataModel;
	 }

	 /**
	  * This is where the Object data is retrieved from the database and
	  * returned as a list of objects for display in the UI.
	  */
	 private DataPage<RebIngenioDTO> getDataPageDTO(int startRow, int pageSize) {
		 // Retrieve the total number of objects from the database.  This
		 // number is required by the DataPage object so the paginator will know
		 // the relative location of the page data.
		 int totalNumberRebIngenio = 0;

		 try {
			 totalNumberRebIngenio = BusinessDelegatorView.findTotalNumberRebIngenio()
			 .intValue();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Calculate indices to be displayed in the ui.
		 int endIndex = startRow + pageSize;

		 if (endIndex > totalNumberRebIngenio) {
			 endIndex = totalNumberRebIngenio;
		 }

		 try {
			 rebIngenio = BusinessDelegatorView.findPageRebIngenio(sortColumnName,
					 sortAscending, startRow, endIndex - startRow);

			 if (Utilities.validationsList(rebIngenio)) {
				 rebIngenioDTO = new ArrayList<RebIngenioDTO>();

				 for (RebIngenio rebIngenioTmp : rebIngenio) {
					 RebIngenioDTO rebIngenioDTO2 = new RebIngenioDTO();
					 rebIngenioDTO2.setIngCodigo(rebIngenioTmp.getIngCodigo()
							 .toString());
					 rebIngenioDTO2.setIngEstado((rebIngenioTmp.getIngEstado() != null)
							 ? rebIngenioTmp.getIngEstado().toString() : null);
					 rebIngenioDTO2.setIngNombre((rebIngenioTmp.getIngNombre() != null)
							 ? rebIngenioTmp.getIngNombre().toString() : null);
					 rebIngenioDTO2.setRebIngenio(rebIngenioTmp);
					 rebIngenioDTO2.setRebIngenioView(this);
					 rebIngenioDTO.add(rebIngenioDTO2);
				 }
			 }

			 // Remove this Renderable from the existing render groups.
			 leaveRenderGroups();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Add this Renderable to the new render groups.
		 joinRenderGroups();
		 // Reset the dirtyData flag.
		 onePageDataModel.setDirtyData(false);
		 // This is required when using Hibernate.  If the SessionManager is not
		 // cleared or closed objects are cached and stale objects will show up
		 // in the table.
		 // This way, the detached objects are reread from the database.
		 // This call is not required with Hibernate, which uses a Query Hint
		 // to clear the l2 cache in the DAO.
		 flag = true;

		 return new DataPage<RebIngenioDTO>(totalNumberRebIngenio, startRow,
				 rebIngenioDTO);
	 }

	 protected boolean isDefaultAscending(String sortColumn) {
		 return true;
	 }

	 /**
	  * This method is called when a render call is made from the server. Render
	  * calls are only made to views containing an updated record. The data is
	  * marked as dirty to trigger a fetch of the updated record from the
	  * database before rendering takes place.
	  */
	 public PersistentFacesState getState() {
		 onePageDataModel.setDirtyData();

		 return state;
	 }

	 /**
	  * This method is called from faces-config.xml with each new session.
	  */
	 public void setRenderManager(RenderManager renderManager) {
		 this.renderManager = renderManager;
	 }

	 public void renderingException(RenderingException arg0) {
		 if (arg0 instanceof TransientRenderingException) {
		 } else if (arg0 instanceof FatalRenderingException) {
			 // Remove from existing Customer render groups.
			 leaveRenderGroups();
		 }
	 }

	 /**
	  * Remove this Renderable from existing uiCustomerBeans render groups.
	  * OnDemandRenderers are named/created using the underlying Customer Number.
	  */
	 private void leaveRenderGroups() {
		 if (Utilities.validationsList(rebIngenioDTO)) {
			 for (RebIngenioDTO rebIngenioTmp : rebIngenioDTO) {
				 renderManager.getOnDemandRenderer("RebIngenioView").remove(this);
			 }
		 }
	 }

	 /**
	  * Add this Renderable to the new uiCustomerBeans render groups.
	  * OnDemandRenderers are named/created using the underlying Customer Number.
	  */
	 private void joinRenderGroups() {
		 if (Utilities.validationsList(rebIngenioDTO)) {
			 for (RebIngenioDTO rebIngenioTmp : rebIngenioDTO) {
				 renderManager.getOnDemandRenderer("RebIngenioView").add(this);
			 }
		 }
	 }

	 public void dispose() throws Exception {
	 }

	 public RenderManager getRenderManager() {
		 return renderManager;
	 }

	 public void setState(PersistentFacesState state) {
		 this.state = state;
	 }

	 public HtmlInputText getTxtIngEstado() {
		 return txtIngEstado;
	 }

	 public void setTxtIngEstado(HtmlInputText txtIngEstado) {
		 this.txtIngEstado = txtIngEstado;
	 }

	 public HtmlInputText getTxtIngNombre() {
		 return txtIngNombre;
	 }

	 public void setTxtIngNombre(HtmlInputText txtIngNombre) {
		 this.txtIngNombre = txtIngNombre;
	 }

	 public HtmlInputText getTxtIngCodigo() {
		 return txtIngCodigo;
	 }

	 public void setTxtIngCodigo(HtmlInputText txtIngCodigo) {
		 this.txtIngCodigo = txtIngCodigo;
	 }

	 public HtmlCommandButton getBtnSave() {
		 return btnSave;
	 }

	 public void setBtnSave(HtmlCommandButton btnSave) {
		 this.btnSave = btnSave;
	 }

	 public HtmlCommandButton getBtnModify() {
		 return btnModify;
	 }

	 public void setBtnModify(HtmlCommandButton btnModify) {
		 this.btnModify = btnModify;
	 }

	 public HtmlCommandButton getBtnDelete() {
		 return btnDelete;
	 }

	 public void setBtnDelete(HtmlCommandButton btnDelete) {
		 this.btnDelete = btnDelete;
	 }

	 public HtmlCommandButton getBtnClear() {
		 return btnClear;
	 }

	 public void setBtnClear(HtmlCommandButton btnClear) {
		 this.btnClear = btnClear;
	 }

	 public HtmlSelectOneMenu getCmbIngEstado() {
		 try {
			 estado.clear();
			 estado.add(new SelectItem("Seleccione un valor"));
			 estado.add(new SelectItem("ACTIVO"));
			 estado.add(new SelectItem("INACTIVO"));
		 } catch (Exception e) {
			 // TODO: handle exception
		 }

		 return cmbIngEstado;
	 }

	 public void setCmbIngEstado(HtmlSelectOneMenu cmbIngEstado) {
		 this.cmbIngEstado = cmbIngEstado;
	 }

	 public void setRenderDataTable(boolean renderDataTable) {
		 this.renderDataTable = renderDataTable;
	 }

	 public void setFlag(boolean flag) {
		 this.flag = flag;
	 }
	 
	 
	 public HtmlCommandButton getBtnAceptar() {
		return btnAceptar;
	}

	public void setBtnAceptar(HtmlCommandButton btnAceptar) {
		this.btnAceptar = btnAceptar;
	}

	public boolean isBtnErrorf() {
		return btnErrorf;
	}

	public void setBtnErrorf(boolean btnErrorf) {
		this.btnErrorf = btnErrorf;
	}

	public List<RebIngenioDTO> getRebIngenioDTO() {
		 return rebIngenioDTO;
	 }

	 public void setRebIngenioDTO(List<RebIngenioDTO> rebIngenioDTO) {
		 this.rebIngenioDTO = rebIngenioDTO;
	 }

	 public List<SelectItem> getEstado() {
		 return estado;
	 }

	 public void setEstado(List<SelectItem> estado) {
		 this.estado = estado;
	 }

	 public BusinessDelegatorView getBusinessDelegatorView() {
		 return businessDelegatorView;
	 }

	 public void setBusinessDelegatorView(BusinessDelegatorView businessDelegatorView) {
		 this.businessDelegatorView = businessDelegatorView;
	 }

	 public TimeZone getTimeZone() {
		 return java.util.TimeZone.getDefault();
	 }

	 /**
	  * A special type of JSF DataModel to allow a datatable and datapaginator
	  * to page through a large set of data without having to hold the entire
	  * set of data in memory at once.
	  * Any time a managed bean wants to avoid holding an entire dataset,
	  * the managed bean declares this inner class which extends PagedListDataModel
	  * and implements the fetchData method. fetchData is called
	  * as needed when the table requires data that isn't available in the
	  * current data page held by this object.
	  * This requires the managed bean (and in general the business
	  * method that the managed bean uses) to provide the data wrapped in
	  * a DataPage object that provides info on the full size of the dataset.
	  */
	 private class LocalDataModel extends PagedListDataModel {
		 public LocalDataModel(int pageSize) {
			 super(pageSize);
		 }

		 public DataPage<RebIngenio> fetchPage(int startRow, int pageSize) {
			 // call enclosing managed bean method to fetch the data
			 return getDataPage(startRow, pageSize);
		 }
	 }

	 private class LocalDataModelDTO extends PagedListDataModel {
		 public LocalDataModelDTO(int pageSize) {
			 super(pageSize);
		 }

		 public DataPage<RebIngenioDTO> fetchPage(int startRow, int pageSize) {
			 // call enclosing managed bean method to fetch the data
			 return getDataPageDTO(startRow, pageSize);
		 }
	 }
}
